//
// Created by sukai on 22-9-26.
//

#ifndef CONTNAV_COMMON_H
#define CONTNAV_COMMON_H

#include <contnav_msgs/TABLE_POINT_POSE.h>
#include "contnav_msgs/TABLE_TASKPOSE.h"
#include "contnav_msgs/TABLE_COSTMAPLAYER.h"
#include "contnav_msgs/TABLE_DICTIONARES.h"
#include "contnav_msgs/TABLE_TIME_TASK.h"
#include "contnav_msgs/Dictionaries.h"
#include "contnav_msgs/DictionariesVector.h"
#include "contnav_srvs/TABLE_CONTORLLER.h"



//-----------------result------------------------------------

//服务返回状态
struct ServiceResultType

{
    static std::string ResultTypeOK;
    static std::string ResultTypeERROR;
    static std::string SUCCEEDED;
    static std::string FAIL;
    static std::string start;
    static std::string executing;
    static std::string end;
    static std::string error;

    static std::string request_get;
    static std::string request_post;
    static std::string EMPTY;
    static std::string FIRST;//第一级
    static std::string SECOND ;//第二级
    static std::string THIRD ;//第三级
    static std::string FOURTH ;//第四级
    static std::string FIFTH ;//第五级
    static std::string SIXTH ;//第六级
    static std::string SEVENTH ;//第七级
    static std::string EIGHTH ;//第八级

    static std::string SPARE ;//前往备用点位
    static std::string NORMAL ;//前往正常点位

    static std::string ONE ;//1
    static std::string ZERO ;//1
    static std::string NEGATIVE_ONE ;//-1

    static int INT_ZERO ;//0
    static int INT_ONE ;//1
    static int INT_NEGATIVE_ONE ;//-1

    static int INT_401 ;// 配置 401 当用户登入失败会提示前端转到登入页面

};


//-----------------数据库------------------------------------

//操作数据库的消息类型
struct TabeAll

{

    contnav_msgs::TABLE_POINT_POSE table_point_pose;

    contnav_msgs::TABLE_COSTMAPLAYER table_costmpaplayer;

    contnav_msgs::TABLE_TASKPOSE table_taskPose;

    contnav_msgs::TABLE_TIME_TASK table_time_task;

    contnav_msgs::TABLE_DICTIONARES table_dictionares;

    contnav_msgs::TABLE_USERS table_users;
    std::string taskNme;
    std::string socketObjectName;
    std::string message;
    std::string controller;
    std::string WaitIsNotGo;
    std::string WaitGoalTime;
    std::string IsGoalTolerancePid;
    std::string IsGoalToleranceMovebase;

};


//数据库表名称
struct   TabeName

{

public :

    static  std::string  TABLE_POINT_POSE;//点位表
    static  std::string  TABLE_COSTMAPLAYER ;//虚拟墙
    static std::string  TABLE_TASKPOSE ;//任务表
    static std::string  TABLE_TIME_TASK ;//定时任务
    static  std::string  TABLE_DICTIONARES ;//字典
    static  std::string TABLE_USERS;//用户表
};

//操作数据库表,增删改查；
struct  TabeOperationType

{

public :
    static  std::string  selectSQLTABL ;
    static  std::string  insertSQLTABL ;
    static  std::string  updateSQLTABL ;
    static  std::string  deleteSQLTABL ;
    static  std::string  insertSQLTABL_BATCH_TASK;
    static  std::string  isReturn_result_sqlStr_true;//是否需要返回sql语句
    static  std::string  isReturn_result_sqlStr_false;//是否需要返回sql语句

    static  std::string  UPDATE ;
    static  std::string  SET ;
    static  std::string  INSERT ;
    static  std::string  INTO ;
    static  std::string  VALUES ;
    static  std::string  deletee ;
    static  std::string  select ;
    static  std::string  count;
    static  std::string  from ;
    static  std::string  WHERE ;
    static  std::string  ORDER ;
    static  std::string  BY ;
    static  std::string  AND ;
    static  std::string  OR ;
    static  std::string  LIMIT ; //显示多少条数据
    static  std::string  offset ;//从第几行的下一行开始

    static  std::string  Id ;

    static  std::string EQ ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。
    static  std::string NE ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。
    static  std::string LT ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。
    static  std::string GT ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。
    static  std::string LE ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。
    static  std::string GE ;//相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。

};



//操作数据库的消息类型
struct ActionQueueMesg

{
    std::string request_controller;//控制器
    std::string typeId;
    std::string markName;
    std::string taskName;
    std::string message;
    std::string controller;
    std::string WaitIsNotGo;
    std::string WaitGoalTime;
    std::string IsGoalTolerancePid;
    std::string IsGoalToleranceMovebase;
    std::string commandStatus;
    std::string command;
    std::string actionQueueMesgStatus;
    contnav_msgs::TABLE_POINT_POSE table_point_pose;
};


//点位表 TABLE_POINT_POSE 创建 点位值 路点值 表格      点位类型 ->TypeId：  0：工作点 1：普通点 ，3：电梯外 ，4：电梯内 ，7：闸机点 ，8：电梯等待点，11：充电桩点，20：狭窄区等待点，76：减速点 ,77: 覆盖点 ,78:重定位
//点位类型
struct PointTypeId

{
    /**
     * 工作点
     */
    static   std::string typeId_0;// 工作点
    static   std::string typeId_1;// 普通点
    static   std::string typeId_3;// 电梯外
    static   std::string typeId_4;// 电梯内
    static   std::string typeId_7;// 闸机点充电桩点
    static   std::string typeId_8;// 电梯等待点
    static   std::string typeId_11;// 充电桩点
    static   std::string typeId_20;// 狭窄区等待点
    static   std::string typeId_76;// 减速点
    static   std::string typeId_77;// 覆盖点
    static   std::string typeId_78;// 重定位
};
//-------------------sql 字段---------------------------------
//点位表 sql 字段
struct TABLE_POINT_POSE_SQL_COLUMN_FIELD

{
    static   std::string id;//mark点位id
    static   std::string Id;//mark点位id
    static   std::string MarkName;//点位名称
    static   std::string TypeId;// 点位类型 ->TypeId：  0：工作点 1：普通点 ，3：电梯外 ，4：电梯内 ，7：闸机点 ，8：电梯等待点，11：充电桩点，20：狭窄区等待点，76：减速点 ,77: 覆盖点 ,78:重定位
    static   std::string MarkNum;//点位编码 存在多个充电座需要通过充电装编号来定位是那个重点装充电； 电梯编码：通过给电梯编码发送指令控制电梯 门禁或闸机设备的编码
    static   std::string MapName;// 点位对应的地图名称
    static   std::string Mapfloor;//地图楼层
    static   std::string FieldNumber;//场地编号 机器人公司如果把数据库放在云上共所有客户使用，就得考虑增加场地编号。用法： 比如某个餐饮店比如海底捞1号店【每家店铺可能包含10台机器人，它们在同一个场景运行，按按场地编号为查询点位的条件，所以它们在统一场地的场地编号都是一致的（方便多机协作）】
    static   std::string FieldName;//场地名称
    static   std::string X;//点位x坐标
    static   std::string Y;//点位y坐标
    static   std::string Z;//点位Z坐标
    static   std::string QX;//点位QX 四元素
    static   std::string QY;//点位QY 四元素
    static   std::string QZ;//点位QZ 四元素
    static   std::string QW;//点位QW 四元素
    static   std::string YAW;//点位yaw 2d
    static   std::string Status;//当前目标点状态 2:在该目标点 1：其它机器人正在前往该目标点 ; 0：该目标点空闲，其它机器人可以前往
    static   std::string Command;//到目的地后需要 tcp 发送这条协议出去操作其它设备，比如机械臂，plc，操作相机图像识别等
    static   std::string CommandStatus;// 是否启用 Command 发送tcp命令，-1：不发送； 1：发送；

};


//虚拟墙字段
struct TABLE_COSTMAPLAYER_SQL_COLUMN_FIELD

{
    static   std::string id;//mark点位id
    static   std::string Id;//虚拟墙id号
    static   std::string FigureType;//图形类型 point：点 至少1个点数据, line：线 至少2个点数据, polygons:多边形 至少3个点数据
    static   std::string FigureName;//虚拟墙线或点名字
    static   std::string FieldNumber;//场地名称编号
    static   std::string FieldName;//场地名称
    static   std::string RobotNumber;//底盘机器人编号
    static   std::string MapName;//地图名字
    static   std::string Mapfloor;//地图楼层
    static   std::string Point_A_X;//第一个点位A
    static   std::string Point_A_Y;
    static   std::string Point_B_X;//第二个点位B
    static   std::string Point_B_Y;
    static   std::string Point_C_X;//第三个点位C
    static   std::string Point_C_Y;
    static   std::string Point_D_X;//第四个点位D
    static   std::string Point_D_Y;

};
//虚拟墙图形类型 //图形类型 point：点 至少1个点数据, line：线 至少2个点数据, polygons:多边形 至少3个点数据
struct COSTMAPLAYER_FigureType
{
static   std::string point;//点
static   std::string line;//线
static   std::string polygons;//多边形

};
// 任务表字段
struct TABLE_TASKPOSE_SQL_COLUMN_FIELD

{
    static   std::string id;//mark点位id
    static   std::string Id;//执行点位任务id号
    static   std::string TaskName;//谁的任务,比如送参车有3个餐盘 ，是第几个餐盘的点位任务
    static   std::string RobotNumber;//机器人编号
    static   std::string MarkName;//点位名称
    static   std::string FieldNumber;//场地编号
    static   std::string FieldName;//场地名称
    static   std::string TypeId;//点位类型
    static   std::string MarkNum;//点位编码
    static   std::string MapName;//点位所在的地图名称
    static   std::string Mapfloor;//点位所在的当前楼层
    static   std::string WaitIsNotGo;//是否自动执行下一条任务； -1:不自动 1：自动
    static   std::string WaitGoalTime;//自动执行下一条数据所等待的时间
    static   std::string IsGoalTolerancePid;//是否开启目标精度调整 -1 不开启,1 开启
    static   std::string IsGoalToleranceMovebase;//导航底层算法是否调整姿态 -1 不开启,1 开启（开启开启目标精度调整后默认底层算法不调整姿态）
    static   std::string X;//点位x坐标
    static   std::string Y;//点位y坐标
    static   std::string Z;//点位Z坐标
    static   std::string QX;//点位QX 四元素
    static   std::string QY;//点位QY 四元素
    static   std::string QZ;//点位QZ 四元素
    static   std::string QW;//点位QW 四元素
    static   std::string YAW;//点位yaw 2d
    static   std::string Status;//当前目标点状态 2:在该目标点 1：其它机器人正在前往该目标点 ; 0：该目标点空闲，其它机器人可以前往
    static   std::string TaskStatus;//当前任务状态 0：未开始  1：机器人正在前往该目标点 ; 2:机器人已经到达该点的目标备用点
    static   std::string Command;//到目的地后需要 tcp 发送这条协议出去操作其它设备，比如机械臂，plc，
    static   std::string CommandStatus;//是否启用 Command 发送tcp命令，-1：不发送； 1：发送；
    static   std::string SocketObjectName;//记录是哪个客户端发送的命令
    static   std::string Message;//接收客户端发来的消息，目标到达后完整返回给客户端
    static   std::string Controller;//给控制器发的指令
    static   std::string TimeNow;//任务生成时间
    static   std::string Remarks;//备注

};



//定时任务字段
struct TABLE_TIME_TASK_SQL_COLUMN_FIELD

{
    static   std::string id;//mark点位id
    static   std::string Id;//任务id号
    static   std::string TypeId;//任务类型
    static   std::string RobotNumber;//机器人编号
    static   std::string Equipment_1;//设备1
    static   std::string Equipment_2;//设备2
    static   std::string Equipment_3;//设备3
    static   std::string Equipment_4;//设备4
    static   std::string Equipment_5;//设备5
    static   std::string Equipment_6;//设备6
    static   std::string Message;//目标到达后完整返回给客户端，或应用端
    static   std::string MarkName;//点位名称
    static   std::string StartTime;//开始时间 "202105241657"【格式】精确到分
    static   std::string EndTime;//结束时间 "202105241657"【格式】精确到分
    static   std::string Status;//任务开始标志 1：开启，-1：关闭
    static   std::string WorkingStatus;//是否正在执行 1：运行 ，-1：停止
};

//定时任务类型
struct TIME_TASK_TypeId

{
    /**
     * 工作点
     */
    static   std::string typeId_0;// 普通任务
    static   std::string typeId_1;// 工作任务
    static   std::string typeId_3;// 覆盖任务
    static   std::string typeId_4;// 路径跟随任务

};

// 字典字段
struct TABLE_DICTIONARES_SQL_COLUMN_FIELD

{
    static   std::string id;//mark点位id
    static   std::string Id;//id号
    static   std::string TargetName;//名称
    static   std::string Key_i;//Key
    static   std::string Value;//值
    static   std::string Status;//状态  1：正常  -1：暂停使用 默认 0
};
// 字典字段key_i 值
struct TABLE_DICTIONARES_KEY

{
    static   std::string fieldNumber;//场地编号
    static   std::string fieldName;//场地名称
    static   std::string robotNumber;//机器人编号
    static   std::string mapName;//当前地图名称
    static   std::string mapfloor;//当前地图楼层
    static   std::string mapPath;//地图路径
    static   std::string softMapState;//建图状态
    static   std::string softEstopState;//软急停状态
    static   std::string createMapAlgorithm;//当前建图算法
    static   std::string mysqlIp;
    static   std::string mysqlIport;
    static   std::string mysqluse;
    static   std::string mysqlpassword;
    static   std::string mysqlDatabaseName;
};


// 用户表
struct TABLE_USERS

{
    static   std::string id;//mark点位id
    static   std::string Id;//id号
    static   std::string Username;//用户名称
    static   std::string Password;//用户密码
    static   std::string AgainPassword;//用户密码
    static   std::string Telephone;
    static   std::string Email;
    static   std::string ActivationCode;//slam系统激活码
    static   std::string Status;//状态  0：正常  -1：暂停使用 默认 0
    static   std::string Remarks;//备注
};


//-----------------ContnavLogger--日志----------------------------------

//log日志
struct ContnavLoggerStr

{
    static   std::string DEBUG;
    static   std::string INFO;
    static   std::string WARN;
    static   std::string ERROR;
    static   std::string FATAL;
};
//log日志
struct ContnavLoggerType

{
    static   std::string savelog;  //保存日志
    static   std::string saveHexlog;  //保存16进制日志
    static   std::string deleteAlllog;//删除所有日志文件
    static   std::string showlogSize;////查看日志大小
};

//-----------------currency_car_action------导航------------------------------

struct currency_car_actionType //发送目标点 action

{
    static   std::string robotController;  //第一级,执行类型 robotController 用户给的俄指令
    static   std::string sendGoal_withTable_point_pose;  //第二级,执行类型 sendGoal_withTable_point_pose ,把目标点坐标 发送个莫 movebase
    static   std::string Active;  //第三级,移动机器人正在做导航移动。导航收到目标点位，正在开始运动；
    static   std::string ActionStatusFinished;  //第四级,到达目标点位
    static   std::string robot_move_to_withTargetName;  //通过点位名字导航到目标点
    static   std::string robot_move_to_withTargetName_simple;  //不通过复杂逻辑发送点位导航
    static   std::string robot_move_to_pose;  //通过pose导航到目标点
    static   std::string request_markerPathFileName;  //通过一个路径文件导航
    static   std::string cancelGoal;//取消点到点导航
    static   std::string cancelMarkerPath;//取消一个路径文件导航
    static   std::string startElevatorOuters;  //进电梯外点
    static   std::string startElevatorInners;  //进电梯内点
    static   std::string endElevatorInners;  //出电梯内点
    static   std::string endElevatorOuters;  //出电梯外点
    static   std::string getResultState;  //获取当前状态

};



struct robotMoveActionType //导航状态

{
    static   std::string ActionStatusWaitingForStart;  //动作正在等待开始
    static   std::string ActionStatusRunning;  //动作正在进行
    static   std::string ActionStatusFinished;  //动作已经完成
    static   std::string ActionStatusPaused;  //动作已经暂停
    static   std::string ActionStatusStopped;  //动作已经停止（取消）
    static   std::string ActionStatusError;  //动作执行过程中出现错误
    static   std::string RECALLED;//勾起;召回
    static   std::string PENDING;//等待
    static   std::string LOST;  //刚启动程序，一次都没有发送命令的时候，就是输出LOST；只要有一次操作后就会一直输出SUCCEEDED
    static   std::string ExternalDeviceCommunicationRunning;  //与外部设备通讯
    static   std::string ExternalDeviceCommunicationError;  //与外部设备通讯故障


};





struct startrobotType //操作导航逻辑

{
    static   std::string go_on;  //动作正在等待开始
    static   std::string park;  //停止所有任务
    static   std::string cancel;  //取消当前任务
    static   std::string next;   //执行下一个任务
    static   std::string getResultState;  //获取当前状态
};

struct arriveStatusType //操作导航逻辑

{
    static   std::string movebaseActionRobotStatus;  //action 返回状态
    static   std::string waitIsNotGoFun;//自动开始下一个任务 [删除队列中的一个任务]
    static   std::string thread_msg;  //thread_msg():从队列中取出数据执行导航,发送导航任务 action /currencycaraction
    static   std::string addSqlQueue;   //批量增加任务表数据
    static   std::string sendGoalWithcreateTimer;   //数据加入到队列中

};

//-----------------电梯返回状态------------------------------
//movebaseActionRobotStatusType

struct robotControllerElevatorType //电梯返回状态

{
    static   std::string elecatorTimeOut;  //超时上电梯
    static   std::string elecatorStop;  //停止上电梯
    static   std::string elecatorWorking;  //正在执行上电梯,
    static   std::string elecatorCurrentInner;  //到达当前楼层内点
    static   std::string elecatorCurrentOuter;  //到达当前楼层外点
    static   std::string elecatorTargetInner;  //到达目标楼层的内点
    static   std::string elecatorTargetOuter;  //到达目标楼层的外点
    static   std::string elecatorSucceeded;  //到达楼层
    static   std::string getResultState;  //获取当前状态

};

//------------对桩状态---charingStateType ---------------------------
struct chargeMoveType //对桩操作

{
    static   std::string startchargeing;  //开始对桩
    static   std::string chargeingOff;  //离桩
    static   std::string chargeingStop;  //停止对桩,
    static   std::string getResultState;  //获取当前状态


};

struct charingStateType //对桩状态

{
    static   std::string AimPileWorking;  //对桩成功中
    static   std::string AimPileWorkingError;  //对桩工作中异常
    static   std::string AimPileFinished;  //对桩成功,
    static   std::string AimPileWorkingTimeOut;  //对桩超时
    static   std::string LeavePileWorking;  //离桩中
    static   std::string LeavePileFinished;  //离桩成功
    static   std::string LeavePileError;  //离桩失败
    static   std::string AimPileWorkingStopWorking;  //停止对桩工作中
    static   std::string AimPileWorkingStop;  //停止对桩


};
//---------------------------------------
struct goalTolerancePidType //pid 目标精度调整

{
    static   std::string startGoalTolerancePid;  //开启 pid 目标精度调整
    static   std::string stopGoalTolerancePid;  //关闭  pid 目标精度调整
    static   std::string getResultState;  //获取当前状态

    static   std::string ActionStatusError_distance_threshold;  //error 机器人当前位姿与目标位姿之间距离大于距离阀值
    static   std::string ActionStatusError_time_out;  //error  机器人当前位姿与目标位姿精度调时间整超时
    static   std::string ActionStatusFinished;  //[到达指定位置] 调整当前机器人姿态与目标机器人姿态一致
    static   std::string ActionStatusRunning_turn;  //[转向] 调整机器人转向角度使机器人面向目标点
    static   std::string ActionStatusRunning_move;  //[移动]机器人向目标机器人方向前进
    static   std::string ActionStatusRunning_attitude;  //[姿态] 调整当前机器人姿态与目标机器人姿态一致
    static   std::string ActionStatusRunning_again;  //[到达指定位置] 调整当前机器人姿态与目标机器人姿态一致（start 精度不够重新继续调整！）

    static   std::string ActionStatusError_ranges_out;  //error 取雷达范围超出ranges,
    static   std::string ActionStatusError_straightAhead;  //小车位正前方探测到障碍物
    static   std::string ActionStatusError_left;  //小车位左侧探测到障碍物
    static   std::string ActionStatusError_right;  //小车位右侧探测到障碍物


};
//---------------------------------------
struct startlaunchType //启动与关闭node  启动地图 保存地图 切换地图

{

            static   std::string createdb;//创建数据库
            static   std::string switchMap;//切换地图服务
            static   std::string startNav;//启动导航
            static   std::string closeNav;//关闭导航
            static   std::string saveMap;//保存地图
            static   std::string createMa;//打开建图
            static   std::string closeMap;//关闭建图
            static   std::string restartMovebase;//重启导航
            static   std::string getResultState;  //获取当前状态
};
//---------------------------------------
struct nodeListMainType //获取所有 运行的 node节点的名称,与mac网卡序列号

{

    static   std::string nodeNameList;// 获取所有node节点
    static   std::string topicNameList;// 获取所有topic名称
    static   std::string ifconfigList;//  获取mac 网卡地址
    static   std::string ip_link;// 无线->查看网卡名称，这里可以查到未启动的无线网卡名
    static   std::string wifi_names;// 无线->查看wifi名字
    static   std::string net_status;// 无线->网络链接状态

};
//---------------------------------------
struct webmainType //web http

{

    static   std::string select; // select
    static   std::string install;// install
    static   std::string update; //  update
    static   std::string deletee; // delete
    static   std::string page; // page
    static   std::string perPage; // perPage

};
//---------------currencyLongCorridor---------------------------
struct currencyLongCorridorType //长走廊 ,效果不好

{
    static   std::string startLongCorridor;  //开启长走廊模式
    static   std::string stopLongCorridor;  //关闭长走廊模式

};
//-------------------------------------------

//---------------currency_saverobotpose---------------------------
struct currency_saverobotposeType

{
    static   std::string initialpose;  //重定位
    static   std::string startSaveposeWithTimer;  //开启轮寻记录当前位置
    static   std::string stopSaveposeWithTimer;  //关闭寻记录当前位置

};
//-------------------------------------------




#endif //CONTNAV_COMMON_H
